Раздел: Языковые конструкции и приемы программирования

Второй уровень сложности

1. Прямая и обратная адресация.
* Ответ (Лекция 2): Способы доступа к элементам последовательности (списка, строки).
* Прямая: Индексы идут от начала, начиная с 0 (0, 1, 2...).
* Обратная: Индексы идут с конца, начиная с -1 (-1 — последний элемент, -2 — предпоследний и т.д.).
* Пример:

    s = "abcde"
    print(s[0])   # 'a' (прямая)
    print(s[-1])  # 'e' (обратная)

2. Срезы списков.
* Ответ (Лекция 2): Механизм извлечения подпоследовательности.
* Синтаксис: [start:stop:step] (начало, конец, шаг).
* Возможности:
* Копирование части списка.
* Переворот списка/строки ([::-1]).
* Выбор элементов через один ([::2]).
* Пример: s[1:-1] — обрезает первый и последний символы.

3. Преобразование списка во множество.
* Ответ (Лекция 2): Используется конструктор set().
* Зачем нужно:
1. Быстрое удаление дубликатов (остаются только уникальные элементы).
2. Подготовка к операциям теории множеств (пересечение, объединение).
* Пример:

    L = [1, 2, 2, 3]
    unique = set(L) # {1, 2, 3}

4. Что такое словарь? Основные функции работы со словарем.
* Ответ (Лекция 2, 3): Неупорядоченная коллекция пар ключ: значение. Ключи должны быть уникальными и неизменяемыми (хэшируемыми).
* Основные операции:
* D[key] — получение значения (или ошибка, если ключа нет).
* D[key] = value — добавление/изменение.
* key in D — проверка наличия ключа.
* D.keys(), D.values() — получение списков ключей и значений.
* Применение в лекциях: Подсчет частоты букв (палиндром), кеширование (числа Фибоначчи).

5. Однострочник для словаря (Dict Comprehension).
* Ответ (Лекция 2): Способ создания словаря в одну строку.
* Синтаксис: {ключ: значение for элемент in коллекция}.
* Пример (из задачи про палиндром):

    # Создаем словарь, где ключ - буква, значение - сколько раз она встречается
    D = {b: s.count(b) for b in set(s)}

6. Однострочник для вложенных циклов (списочное включение).
* Ответ (Лекция 5): Используется для обработки многомерных структур (матриц) или создания декартовых произведений.
* Синтаксис: [выражение for i in ... for j in ...].
* Нюанс: Часто используется внутри функций агрегации, таких как sum() или all().
* Пример (проверка матрицы на нули):

    # Проверяем все элементы матрицы M[i][j]
    all(M[i][j] == 0 for i in range(rows) for j in range(cols))

7. Counter из библиотеки collections.
* Ответ (Лекция 2): Специализированный словарь, предназначенный для подсчета количества неизменяемых объектов.
* Как работает: Принимает на вход итерируемый объект (строку, список) и возвращает словарь, где ключи — элементы, а значения — их количество.
* Пример:

    from collections import Counter
    Counter("aabbc") # вернет {'a': 2, 'b': 2, 'c': 1}

8. Многомерный массив numpy.
* Ответ (Лекции 2, 5): Объект array из библиотеки numpy.
* Отличие от списка списков:
1. Поддерживает многомерные срезы (например, M[:, 1] — взять второй столбец целиком, что невозможно в обычных списках Python M[:][1]).
2. Работает быстрее и занимает меньше памяти.
3. Позволяет выполнять векторные операции (сложение массивов, умножение на число и т.д. без циклов).

import numpy as np

# Создаем матрицу numpy из списка списков
M_list = [[1, 2, 3],
          [4, 5, 6],
          [7, 8, 9]]
M = np.array(M_list)

# 1. Доступ к элементу (строка, столбец)
print(M[1, 2])  
# Вывод: 6 (строка с индексом 1, столбец с индексом 2)
# В обычном Python это было бы M[1][2]

# 2. Доступ к столбцу (Срез по всем строкам, конкретный столбец)
# Синтаксис: [строки, столбцы]
print(M[:, 1])  
# Вывод: [2 5 8] 
# : означает "все элементы по этому измерению"

# 3. Вырезка подматрицы (Слайсинг)
# Берем строки с 0 по 1 (не вкл. 2) и столбцы с 1 до конца
sub_matrix = M[0:2, 1:]
print(sub_matrix)
# Вывод:
# [[2 3]
#  [5 6]]

# 4. Векторные операции (Бонус!)
# Умножим все элементы матрицы на 2. Без циклов!
print(M * 2)
# Вывод:
# [[ 2  4  6]
#  [ 8 10 12]
#  [14 16 18]]

# 5. Фильтрация (Маскирование)
# Выберем все элементы больше 5
print(M[M > 5])
# Вывод: [6 7 8 9]
← Меню